#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <pthread.h>
#include <stdlib.h>

// 这里的计算平方只是假设，可以想象成是一个需要耗时1秒的复杂计算
int calc_sqr(int a)
{
    sleep(1);
    return a * a;
}

//多线程返回计算结果并注销线程
void *calc_sqr_pthread(void *arg){
    //将数组地址转为数字
    int a = *(int *)arg;
    //返回的值应该防止该函数销毁，使用动态内存分配
    int *result = malloc(sizeof(int));
    *result = calc_sqr(a);
    //结束当前线程，并返回结果
    pthread_exit(result);
}

// 对一个数组中的数分别求平方然后再汇总求和
int main(int argc, char const *argv[])
{
    int items[5] = {1, 2, 3, 4, 5};
    int sqrs[5];
    pthread_t threads[5];

    // 记录开始时间和结束时间，因为sleep（1）执行5次，所以总耗时为5秒
    struct timeval start_t, end_t;
    gettimeofday(&start_t, NULL);

    // 计算items中每个数的平方，并存储到sqrs中
    for (int i = 0; i < 5; i++)
    {
        //sqrs[i] = calc_sqr(items[i]);
        //创建5个线程，每个线程计算一个数的平方（函数参数是数字）
        pthread_create(&threads[i], NULL, calc_sqr_pthread, &items[i]);
    }
    
    // 累加所有的平方值
    int sum = 0;
    for (int i = 0; i < 5; i++)
    {
        void *result;
        //等待线程结束，并获取返回值
        pthread_join(threads[i], &result);
        sum += *(int *)result;
    }
    gettimeofday(&end_t, NULL);
    // 输出计算耗时
    printf("time = %ld秒\n", end_t.tv_sec - start_t.tv_sec);
    printf("sum = %d\n", sum);

    return 0;
}

